/**
 * XGPHP 轻量级PHP框架
 * @link http://xgphp.xg3.cn
 * @version 2.0.0
 * @license http://www.apache.org/licenses/LICENSE-2.0
 * @author 讯高科技 <xungaokeji@qq.com>
*/
(function($){
xg.def('tpl',function(){
	const htmlCache={};
	function html(val){
		if(val && /^\#?[a-zA-Z][a-zA-Z0-9_\-\:]*$/.test(val) && val.length < 30){
			if(val.substring(0,1)=='#'){
				val=val.substring(1);
			}
			if(xg.isunde(htmlCache[val])){
				if($('#'+val).length){
					htmlCache[val]=$('#'+val).html();
				}else{
					htmlCache[val]='';
				}
			}
			return htmlCache[val];
		}
		return val||'';
	}
	function tpl(val,data){
		let template=html(val);
		template=template.replace(/\{\{if (.*?)\}\}(?:(.*?)(?:\{\{else\}\}(.*?))?)\{\{\/if\}\}/s,function(){
			const cond=arguments[1];
			const cont1=arguments[2];
			const cont2=arguments[3];
			if(data[cond]){
				return tpl(cont1,data);
			}else if(cont2){
				return tpl(cont2,data);
			}
			return '';
		});
		template=template.replace(/\{\{for\#([a-zA-Z0-9\-\_]+)(?:\:([a-zA-Z0-9\_]+))?\}\}/g, function() {
			const id=arguments[1];
			const key=arguments[2];
			if(key){
				return forCont(id,data[key]);
			}else{
				return forCont(cont,data);
			}
			return '';
		});
		template=template.replace(/\{\{for(?:\:([a-zA-Z0-9\_]+))?\}\}(.*?)\{\{\/for\}\}/gs, function() {
			const key=arguments[1];
			const cont=arguments[2];
			if(key){
				return forCont(cont,data[key]);
			}else{
				return forCont(cont,data);
			}
			return '';
		});
		template=template.replace(/\{\{([a-zA-Z0-9\-\_]+)\}\}/g, function() {
			const key=arguments[1];
			if(xg.isstr(data[key]) || xg.isnum(data[key])){
				return data[key];
			}
			return '';
		});
		template=template.replace(/\{\{\#([a-zA-Z0-9\-\_]+)(?:\:([a-zA-Z0-9\_]+))?\}\}/g, function() {
			const id = arguments[1];
			const key = arguments[2];
			if(key){
				return tpl(id,data[key]);
			}else{
				return tpl(id,data);
			}
		});
		return template;
	};
	function forCont(cont,data){
		const _arr=[];
		if(xg.isarr(data)){
			for(let item of data){
				_arr.push(tpl(cont,item));
			}
		}
		if(xg.isobj(data)){
			for(let key in data){
				_arr.push(tpl(cont,data[key]));
			}
		}
		return _arr.join('');
	}
	return tpl;
});
})(jQuery);